// [2010统考真题] .设将n (n> 1)个整数存放到- -维数组R中。设计一个在时间和空间
// 两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置，即将R
// 中的数据由(Xo, X,. Xn- )变换为(Xp, xp+1.,",Xn-1, Xo,X,,Xp-1)。 要求:
//      1)给出算法的基本设计思想。
//      2)根据设计思想，采用C或C++或Java语言描述算法，关键之处给出注释。
//      3)说明你所设计算法的时间复杂度和空间复杂度。

#pragma once
#include "vector"
#include "iostream"

template <typename ElemType>
void reverse(ElemType R[], int minIndex, int maxIndex)
{
    //这一处相减写成相加了...
    int middle = (maxIndex - minIndex) / 2;
    for (int i = 0; i < middle; i++)
    {
        ElemType temp = R[minIndex + i];
        R[minIndex + i] = R[maxIndex - i];
        R[maxIndex - i] = temp;
    }
}
template <typename ElemType>
void leftMoveArr(ElemType R[], int R_size, int moveStep)
{
    //前面moveStep个元素与后面的元素交换。
    // 实际操作就是三次交换
    reverse(R, 0, R_size - 1);
    reverse(R, 0, R_size - moveStep - 1);
    reverse(R, R_size - moveStep, R_size - 1);
}

int main()
{
    // std::vector<int> vec1; // vec2, vec3;
    int arr[100];
    std::cout << "hello"
              << "\r\n";
    //init data
    for (int i = 0; i < 100; i++)
    {
        arr[i] = i;
    }
    leftMoveArr(arr, 100, 30);

    // fastFind(vec1, 9);
    for (int i = 0; i < 100; i++)
    {
        std::cout << arr[i] << ",";
    }
    std::cout << "\r\n";
    // for (int i = 0; i < vec2.size(); i++)
    // {
    //     std::cout << vec2[i] << ",";
    // }
    // std::cout << "\r\n";
    // ///////////////////////////////////////////////////
    // combineAB2C(vec1, vec2, vec3);
    // for (int i = 0; i < vec3.size(); i++)
    // {
    //     std::cout << vec3[i] << ",";
    // }
    // std::cout << "\r\n";
    return 0;
}